<?php
	/*
    Copyright 2013 nohyoo.com

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
   
	File : Database.php
	Author : Said Samadli
	Created : 03/06/2013
	*/
	class PHPREST {
		
		public $_allow = array();
		public $_content_type = "application/json";
		public $_request = array();
		
		private $_method = "NA";		
		private $_code = 200;		
		
		public function __construct(){
			$this->inputs();

		}
		
		public function set_request_method() {
            if($_SERVER['REQUEST_METHOD'] == 'POST') { 
              if(isset($_POST['_method']) && ($_POST['_method'] == 'PATCH' || $_POST['_method'] == 'PUT' || $_POST['_method'] == 'DELETE' || $_POST['_method'] == 'UPDATE')) {
                $method = strtolower($_POST['_method']);
              } else {
                $method = 'post';
              }
            }		
		}
		
		public function get_referer(){
			return $_SERVER['HTTP_REFERER'];
		}
		
		
		public function response($data,$status){
			$this->_code = ($status)?$status:200;
			$this->set_headers();
			echo $data;
			exit;
		}
		
		private function get_status_message(){
			$status = array(
						100 => 'Continue',  
						101 => 'Switching Protocols',  
						200 => 'OK',
						201 => 'Created',  
						202 => 'Accepted',  
						203 => 'Non-Authoritative Information',  
						204 => 'No Content',  
						205 => 'Reset Content',  
						206 => 'Partial Content',  
						300 => 'Multiple Choices',  
						301 => 'Moved Permanently',  
						302 => 'Found',  
						303 => 'See Other',  
						304 => 'Not Modified',  
						305 => 'Use Proxy',  
						306 => '(Unused)',  
						307 => 'Temporary Redirect',  
						400 => 'Bad Request',  
						401 => 'Unauthorized',  
						402 => 'Payment Required',  
						403 => 'Forbidden',  
						404 => 'Not Found',  
						405 => 'Method Not Allowed',  
						406 => 'Not Acceptable',  
						407 => 'Proxy Authentication Required',  
						408 => 'Request Timeout',  
						409 => 'Conflict',  
						410 => 'Gone',  
						411 => 'Length Required',  
						412 => 'Precondition Failed',  
						413 => 'Request Entity Too Large',  
						414 => 'Request-URI Too Long',  
						415 => 'Unsupported Media Type',  
						416 => 'Requested Range Not Satisfiable',  
						417 => 'Expectation Failed',  
						500 => 'Internal Server Error',  
						501 => 'Not Implemented',  
						502 => 'Bad Gateway',  
						503 => 'Service Unavailable',  
						504 => 'Gateway Timeout',  
						505 => 'HTTP Version Not Supported');
			return ($status[$this->_code])?$status[$this->_code]:$status[500];
		}
		
		//public function get_request_method(){
		//	return $_SERVER['REQUEST_METHOD'];
		//}
		
		public function get_request_method() {
			if ($_method="NA") {
				if($_SERVER['REQUEST_METHOD'] == 'POST') { 
					if(isset($_POST['_method']) && 
					  ($_POST['_method'] == 'PATCH' || 
					   $_POST['_method'] == 'PUT' || 
					   $_POST['_method'] == 'DELETE' || 
					   $_POST['_method'] == 'UPDATE' || 
					   $_POST['_method'] == 'POST')) {
						$_method = strtoupper($_POST['_method']);
					}
					else {
						$_method = 'POST';
					}
				} else {
					$_method = $_SERVER['REQUEST_METHOD'];
				}
			}			
			
			return $_method;
		}
		
		private function inputs(){
			switch($_SERVER['REQUEST_METHOD']){
				case "POST":
					$this->_request = $this->cleanInputs($_POST);
					break;
				case "GET":
				case "DELETE":
					$this->_request = $this->cleanInputs($_GET);
					break;
				case "PUT":
					parse_str(file_get_contents("php://input"),$this->_request);
					$this->_request = $this->cleanInputs($this->_request);
					break;
				default:
					$this->response('',406);
					break;
			}
		}		
		
		private function cleanInputs($data){
			$clean_input = array();
			if(is_array($data)){
				foreach($data as $k => $v){
					$clean_input[$k] = $this->cleanInputs($v);
				}
			}else{
				if(get_magic_quotes_gpc()){
					$data = trim(stripslashes($data));
				}
				$data = strip_tags($data);
				$clean_input = trim($data);
			}
			return $clean_input;
		}		
		
		private function set_headers(){
			header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
			header("Content-Type:".$this->_content_type);
		}
	}	
?>